.SILENT:

# ESTE ES EL MAKEFILE PARA EL PROGRAMA PRINCIPAL. 
# DEBE EJECUTARSE CON EL COMANDO MAKE. PARA VOLVER EL DIRECTORIO A SU ESTADO ORIGINAL
# UTILIZAR EL COMANDO MAKE CLEAN.

#DIRECTORIO DONDE SE EJECUTO EL MAKE
MAKE_DIR = $(shell pwd)

#COMPILADOR POR DEFAULT
CC = gcc

# DIRECTIVAS DEL COMPILADOR
CFLAGS = -g -Wall -std=c99 -pedantic 

# NOMBRE DEL PROGRAMA PRICIPAL
EXEC = lsi-index

# BIBLIOTECAS PARA EL PROGRAMA PRINCIPAL
SRC = $(wildcard *.c)

# CODIGO OBJETO DE LAS BIBLIOTECAS DEL PROGRAMA PRINCIPAL
OBJS =

# UBICACION DE LAS DEPENDENCIAS EXTERNAS
LIBS_DIR = ../../tda/lista/ ../../utilidades/ ../../tda/abb_avl/ ../../tda/vector_dinamico/ ../../tda/pila/ ../../utilidades/termino/ ../../utilidades/dir_explorer/ ../../parser/ ../../tda/cola/ ../../utilidades/merge/ ../../tda/termino_merge/ ../../tda/buffer_merge ../../tda/heap ../../construccion_matriz

# CODIGO OBJETO DE LAS DEPENDECIAS EXTERNAS
LIBS = ../../tda/lista/lista.o ../../utilidades/utilidades.o ../../utilidades/merge/merge.o ../../tda/abb_avl/abb_avl.o ../../tda/vector_dinamico/vector_dinamico.o ../../tda/pila/pila.o ../../utilidades/termino/termino.o ../../utilidades/dir_explorer/dir_explorer.o ../../parser/parser.o ../../tda/cola/cola.o  ../../tda/termino_merge/termino_merge.o ../../tda/buffer_merge/buffer_merge.o ../../tda/heap/heap.o ../../construccion_matriz/matriz_svdlibc.o ../../SVDLIBC/svdlib.o ../../SVDLIBC/svdutil.o ../../SVDLIBC/las2.o 

# Ruta relativa de los headers
HEADERS_DIR = ../../tda/lista/lista.h ../../utilidades/utilidades.h ../../tda/abb_avl/abb_avl.h ../../tda/vector_dinamico/vector_dinamico.h ../../tda/pila/pila.h ../../utilidades/termino/termino.h ../../utilidades/dir_explorer/dir_explorer.h ../../parser/parser.h ../../tda/cola/cola.h ../../utilidades/merge/merge.h  ../../tda/termino_merge/termino_merge.h ../../tda/buffer_merge/buffer_merge.h  ../../tda/heap/heap.h ../../construccion_matriz/matriz_svdlibc.h ../../SVDLIBC/svdlib.h ../../SVDLIBC/svdutil.h

# HEADERS DE LAS DEPENDENCIAS EXTERNAS 
HEADERS = lista.h utilidades.h abb_avl.h vector_dinamico.h pila.h termino.h dir_explorer.h parser.h cola.h merge.h termino_merge.h buffer_merge.h heap.h matriz_svdlibc.h svdlib.h svdutil.h

# DIRECTIVAS DEL MEM CHECK
VFLAGS = valgrind --leak-check=full --show-reachable=yes --track-origins=yes

# DIRECTORIO DONDE SE ENCUENTRAN EL CORPUS DE TEXTOS A PARSEAR
#CORPUS_DIR = ../../Corpus/
CORPUS_DIR = ../prueba/

# DEFAULT
all: prepare $(EXEC)
# SILENT DEFAULT
silent: all

##### ##### EJECUCION DEL PROGRAMA ##### #####

# CORRE EL PROGRAMA PRINCIPAL
run: 
	echo Corriendo programa principal...
	./$(EXEC) -d $(CORPUS_DIR) -n 150 -p 3

# CORRE PRUEBAS DE MEMORIA SOBRE EL PROGRAMA PRINCIPAL
test: 
	echo Corriendo programa principal en modo memCheck...
	$(VFLAGS) ./$(EXEC) -d ../prueba/ -n 10 -p 2

# PARSEA EL DIRECTORIO DEL CORPUS
parse:
	echo Parseando archivos...
	./$(EXEC) --step=1 -d $(CORPUS_DIR)
	
# REALIZA UN MERGE DE LOS ARCHIVOS PARSEADOS
merge:
	echo Mergeando subarchivos...
	./$(EXEC) --step=2
	
# GENERA UNA MATRIZ A PARTIR DEL MERGE REALIZADO	
matriz:
	echo Construyendo matriz...
	./$(EXEC) --step=3

# REALIZA UNA DVS DE LA MATRIZ GENERADA. UTILIZA EL PROGRAMA SVDLIBC
dvs:
	echo Reduciendo dimensiones...
	./$(EXEC) --step=4 --dimension=150
	
uxs:
	echo Reduciendo dimensiones...
	./$(EXEC) --step=5

##### ##### CREACION DEL EJECUTABLE ##### #####

# COMPILA DEPENDECIAS EXTERNAS
prepare:
	echo Compilando librerias externas
	$(foreach dir,$(LIBS_DIR),\
		echo -n $(dir)... ;\
		cd $(dir); make objects; \
		echo Listo;\
		cd $(MAKE_DIR);)
	cp $(HEADERS_DIR) ./

# CONSTRUYE EL PROGRAMA PRINCIPAL
$(EXEC): $(OBJS)
	echo -n Compilando el programa principal...
	$(CC) $(CFLAGS) $(LIBS) $(OBJS) $(SRC) -o $(EXEC) -lm
	rm -f $(HEADERS) *.o
	echo OK
	
##### ##### LIMPIEZA DEL DIRECTORIO	##### #####

# LIMPIA EL DIRECTORIO BASE Y LOS DE LAS DEPENDENCIAS EXTERNAS
clean:
	$(foreach dir,$(LIBS_DIR),\
		cd $(dir);make clean; \
		cd $(MAKE_DIR);)
	rm -f *.o $(EXEC) $(PARSER) $(HEADERS) output-* file-id *.subarch *.log *.bin term_string *.mat ./-* *.mat *~ gmon.out Profile.txt

# LIMPIA LOS SUBARCHIVOS GENERADOS POR EL PROGRAMA
cleansub:
	rm -f *.subarch *.log output-fase* gmon.out Profile.txt

